/*
 * Copyright (c) 2013, 5 Idiots. All rights reserved.
 */
package safari.controller.sell;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import safari.model.common.ListVO;
import safari.model.member.MemberVO;
import safari.model.sell.SellBoardService;
import safari.model.sell.SellBoardVO;
/**
 * SellBoardController 클래스
 * @author Harry
 *
 */
public class SellBoardController extends MultiActionController{
	// 파일 저장 경로
	private String path;
	public void setPath(String path){
		this.path=path;
	}
	private SellBoardService sellBoardService;
	/**
	 * SellBoardController의 생성자. 이 생성자의 인자값에 
	 * xml의 bean을 주입해서 sellBoardService를 사용한다.
	 * @param sellBoardService
	 */
	public SellBoardController(SellBoardService sellBoardService){
		this.sellBoardService=sellBoardService;
	}
	/**
	 * 판매 글을 작성하는 메서드이다. 글 등록 성공시 글 상세보기 페이지로 이동한다.
	 * @param svo
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView writeContent(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session, SellBoardVO svo) throws SQLException{
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		// 회원이 업로드한 이미지의 시간정보를 String 타입의 변수로 저장한다.   
		Long now=System.currentTimeMillis();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy년MM월dd일HH시mm분ss초_");
		String currentTime=sdf.format(now);
		// 파일 업로드 로직
		MultipartFile mFile=svo.getUploadFile();
		String orgFileName=mFile.getOriginalFilename();
		if(orgFileName!=""){
			String destFileName=currentTime+orgFileName;
			File copyFile=new File(path+destFileName);
			try {
				if(mvo==null){
					throw new NullPointerException("로그인을 하셔야 글을 작성하실 수 있습니다.");
				}
				mFile.transferTo(copyFile);
				svo.setOrgFileName(orgFileName);
				svo.setDestFileName(destFileName);
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		svo.setMvo(mvo);
		svo=sellBoardService.writeContent(svo);
		return new ModelAndView("sell/sell_content","svo",svo);
	}
	/**
	 * 판매글을 삭제하는 메서드이다.
	 * 판매완료된 글은 삭제할 수 없다.
	 * @param mvo
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView deleteContent(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session) throws SQLException{
		String resultMessage="";
		String path="error";
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		String id=mvo.getId();
		int sellNo=Integer.parseInt(request.getParameter("sellNo"));
		String destFileName=request.getParameter("destFileName");
		String sellStatus=request.getParameter("sellStatus");
		String sellContentWriter=request.getParameter("sellContentWriter");
		if(!id.equals(sellContentWriter)){
			resultMessage="글 작성자만 글 삭제가 가능합니다.";
			path="sell_delete_result";
		}else if(sellStatus.equals("판매완료")){
			resultMessage="판매완료된 글은 삭제할 수 없습니다.";
			path="sell_delete_result";
		}else if(sellStatus.equals("판매중")){
			SellBoardVO svo=new SellBoardVO();
			svo.setSellNo(sellNo);
			svo.setDestFileName(destFileName);
			svo.setMvo(new MemberVO(id));
			File file=new File(this.path+destFileName);
			file.delete();
			sellBoardService.deleteContent(svo);
			resultMessage="해당 글을 삭제하셨습니다.";
			path="sell_delete_result";
		}
		return new ModelAndView("sell/"+path,"resultMessage",resultMessage);
	}
	/**
	 * 판매글 수정하는 메서드
	 * @param mvo
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView updateContent(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session, SellBoardVO svo) throws SQLException{
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		String urlPath="error";
		String id=mvo.getId();
		String sellStatus=request.getParameter("sellStatus");
		String sellContentWriter=request.getParameter("sellContentWriter");
		String resultMessage="";
		if(!id.equals(sellContentWriter)){
			resultMessage="글 작성자만 글 수정이 가능합니다.";
			path="sell_update_fail";
			return new ModelAndView("sell/"+urlPath,"resultMessage", resultMessage);
		}else if(sellStatus.equals("판매완료")){
			resultMessage="판매완료된 글은 수정할 수 없습니다.";
			path="sell_update_fail";
			return new ModelAndView("sell/"+urlPath,"resultMessage", resultMessage);
		}else if(sellStatus.equals("판매중")){
		// 회원이 업로드한 이미지의 시간정보를 String 타입의 변수로 저장한다.   
		Long now=System.currentTimeMillis();
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy년MM월dd일HH시mm분ss초_");
		String currentTime=sdf.format(now);
		// 파일 업로드 로직
		MultipartFile mFile=svo.getUploadFile();
		String orgFileName=mFile.getOriginalFilename();
		if(orgFileName!=""){
			String destFileName=currentTime+orgFileName;
			File copyFile=new File(path+destFileName);
			try {
				if(mvo==null){
					throw new NullPointerException("로그인을 하셔야 글을 작성하실 수 있습니다.");
				}
				System.out.println("~~~~~"+copyFile+"   "+orgFileName+" "+destFileName);
				mFile.transferTo(copyFile);
				svo.setOrgFileName(orgFileName);
				svo.setDestFileName(destFileName);
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		svo.setMvo(mvo);
		svo=sellBoardService.updateContent(svo);
		urlPath="sell_content";
		}
		return new ModelAndView("sell/"+urlPath,"svo", svo);
	}
	/**
	 * 판매 글 수정 페이지를 보여주는 메서드
	 * @param request
	 * @param response
	 * @param sellNo
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView updateView(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session) throws SQLException{
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		String path="error";
		String id=mvo.getId();
		String sellContentWriter=request.getParameter("sellContentWriter");
		if(!id.equals(sellContentWriter)){
			return new ModelAndView("sell/sell_update_fail","resultMessage","글 작성자만 수정이 가능합니다.");
		}
		int sellNo=Integer.parseInt(request.getParameter("sellNo"));
		SellBoardVO svo=sellBoardService.updateView(sellNo);
		return new ModelAndView("sell/sell_update","svo",svo);
	}
	public ModelAndView getWriteView(HttpServletRequest request, 
			HttpServletResponse response) throws SQLException{
		return new ModelAndView("sell/sell_write");
	}
	public ModelAndView findByTitle(String keyword) throws SQLException{
		return null;
	}
	public ModelAndView findByContent(String keyword) throws SQLException{
		return null;
	}
	public ModelAndView findByProductName(String keyword) throws SQLException{
		return null;
	}
	public ModelAndView findByTitleAndContent(String keyword) throws SQLException{
		return null;
	}
	/**
	 * 상세 글보기 페이지를 불러오는 메서드
	 * @param request
	 * @param response
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView showContent(HttpServletRequest request, 
			HttpServletResponse response, HttpSession session) throws SQLException{
		MemberVO mvo=(MemberVO)session.getAttribute("userInfo");
		if(mvo==null){
			return new ModelAndView("error");
		}
		int sellNo=Integer.parseInt(request.getParameter("sellNo"));
		// null 이나 ""로는 해결이 안되던데... 이렇게 문자열 "null"로 해야하나...;
		String id="null";
		try{
			id=mvo.getId();
		}finally{
			SellBoardVO svo=sellBoardService.showContent(sellNo, id);
			return new ModelAndView("sell/sell_content","svo",svo);
		}
	}
	/**
	 * 게시판 불러오는 메서드
	 * @param request
	 * @param response
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView getContentList(HttpServletRequest request, 
			HttpServletResponse response) throws SQLException{
		int nowPage=Integer.parseInt(request.getParameter("pageNo"));
		ListVO lvo=sellBoardService.getContentList(nowPage);
		return new ModelAndView("sell/sell_list","lvo",lvo);
	}
	/**
	 * 게시글 수정 시 업로드 했던 파일을 삭제하는 메서드
	 * @param request
	 * @param response
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView deleteFile(HttpServletRequest request, 
			HttpServletResponse response) throws SQLException{
		// 삭제할 파일명을 받아온다.
		String filename=request.getParameter("filename");
		// 실제 저장된 파일을 삭제한다.
		File file=new File(this.path+filename);
		file.delete();
		// DB에 저장되 있는 파일 이름도 삭제한다.
		sellBoardService.deleteFileName(filename);
		return new ModelAndView("JsonView","message","파일삭제~");
	}
}
